@Luminary
2年前 提问
1个回答
哪些措施可以防御栈溢出攻击
Simon
2年前
以下措施可以防御栈溢出攻击:
地址空间随机化:顾名思义,程序每次加载到的内存位置是随机的,所以,即使可以利用栈溢出控制函数的返回地址,但是无法确定恶意代码的位置,因此,可以有效地防范栈溢出攻击。
不可执行栈:不可执行栈的基本原理是将数据所在的内存页标记为不可执行的,当进程尝试去执行数据页面上的指令时,CPU就会抛出异常,而不是去执行。所以,当开启了不可执行栈选项时,即使我们的恶意代码已经插入到内存,但由于处在数据页面,因此无法执行从而实现防御攻击。
Stack Guard:gcc中的Stack Guard的保护原理时利用 “Canaries” 检测对函数栈的破坏。具体是再缓冲区(如:栈)和控制信息(如 ebp等)间插入一个canary word。这样,当缓冲区溢出时,再返回地址被覆盖之前canary word会首先被覆盖,通过检测canary word的值是否被修改,就可以判断是否发生了溢出,如果出现溢出则进行终止溢出的进程来进行防御。